 /*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.actions;

 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.action.LegacyActionTools;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.util.PropertyChangeEvent;

 /**
  * A <code>LabelRetargetAction</code> extends the behavior of
  * RetargetAction. It will track the enable state, label, and
  * tool tip text of the target action..
  * <p>
  * This class may be instantiated. It is not intented to be subclassed.
  * </p>
  *
  * @since 2.0
  */
 public class LabelRetargetAction extends RetargetAction {
     private String defaultText;

     private String defaultToolTipText;

     private ImageDescriptor defaultHoverImage;

     private ImageDescriptor defaultImage;

     private ImageDescriptor defaultDisabledImage;

     private String acceleratorText;

     /**
      * Constructs a LabelRetargetAction with the given action id and text.
      *
      * @param actionID the retargetable action id
      * @param text the action's text, or <code>null</code> if there is no text
      */
     public LabelRetargetAction(String actionID, String text) {
         this(actionID, text, IAction.AS_UNSPECIFIED);
     }

     /**
      * Constructs a RetargetAction with the given action id, text and style.
      *
      * @param actionID the retargetable action id
      * @param text the action's text, or <code>null</code> if there is no text
      * @param style one of <code>AS_PUSH_BUTTON</code>, <code>AS_CHECK_BOX</code>,
      * <code>AS_DROP_DOWN_MENU</code>, <code>AS_RADIO_BUTTON</code>, and
      * <code>AS_UNSPECIFIED</code>.
      * @since 3.0
      */
     public LabelRetargetAction(String actionID, String text, int style) {
         super(actionID, text, style);
         this.defaultText = text;
         this.defaultToolTipText = text;
         acceleratorText = LegacyActionTools.extractAcceleratorText(text);
     }

     /**
      * The action handler has changed. Update self.
      */
     protected void propagateChange(PropertyChangeEvent event) {
         super.propagateChange(event);
         String prop = event.getProperty();
         if (prop.equals(IAction.TEXT)) {
             String str = (String ) event.getNewValue();
             super.setText(appendAccelerator(str));
         } else if (prop.equals(IAction.TOOL_TIP_TEXT)) {
             String str = (String ) event.getNewValue();
             super.setToolTipText(str);
         } else if (prop.equals(IAction.IMAGE)) {
             updateImages(getActionHandler());
         }
     }

     /**
      * Sets the action handler. Update self.
      */
     protected void setActionHandler(IAction handler) {
         // Run the default behavior.
 super.setActionHandler(handler);

         // Now update the label, tooltip and images.
 if (handler == null) {
             super.setText(defaultText);
             super.setToolTipText(defaultToolTipText);
         } else {
             // If no text is specified by the handler, use the default text. Fixes 22529.
 String handlerText = handler.getText();
             if (handlerText == null || handlerText.length() == 0) {
                 handlerText = defaultText;
             }
             super.setText(appendAccelerator(handlerText));
             super.setToolTipText(handler.getToolTipText());
         }
         updateImages(handler);
     }

     /* (non-Javadoc)
      * Method declared on IAction.
      */
     public void setDisabledImageDescriptor(ImageDescriptor image) {
         super.setDisabledImageDescriptor(image);
         defaultDisabledImage = image;
     }

     /* (non-Javadoc)
      * Method declared on IAction.
      */
     public void setHoverImageDescriptor(ImageDescriptor image) {
         super.setHoverImageDescriptor(image);
         defaultHoverImage = image;
     }

     /* (non-Javadoc)
      * Method declared on IAction.
      */
     public void setImageDescriptor(ImageDescriptor image) {
         super.setImageDescriptor(image);
         defaultImage = image;
     }

     /**
      * Sets the action's label text to the given value.
      */
     public void setText(String text) {
         super.setText(text);
         acceleratorText = LegacyActionTools.extractAcceleratorText(text);
         defaultText = text;
     }

     /**
      * Sets the tooltip text to the given text.
      * The value <code>null</code> clears the tooltip text.
      */
     public void setToolTipText(String text) {
         super.setToolTipText(text);
         defaultToolTipText = text;
     }

     /**
      * Ensures the accelerator is correct in the text (handlers are not
      * allowed to change the accelerator).
      */
     private String appendAccelerator(String newText) {
         if (newText == null) {
             return null;
         }

         // Remove any accelerator
 String str = removeAcceleratorText(newText);
         // Append our accelerator
 if (acceleratorText != null) {
             str = str + acceleratorText;
         }
         return str;
     }

     /**
      * Updates the images for this action based on the given handler.
      */
     private void updateImages(IAction handler) {
         if (handler == null) {
             super.setHoverImageDescriptor(defaultHoverImage);
             super.setImageDescriptor(defaultImage);
             super.setDisabledImageDescriptor(defaultDisabledImage);
         } else {
             // use the default images if the handler has no images set
 ImageDescriptor hoverImage = handler.getHoverImageDescriptor();
             ImageDescriptor image = handler.getImageDescriptor();
             ImageDescriptor disabledImage = handler
                     .getDisabledImageDescriptor();
             if (hoverImage != null || image != null || disabledImage != null) {
                 super.setHoverImageDescriptor(hoverImage);
                 super.setImageDescriptor(image);
                 super.setDisabledImageDescriptor(disabledImage);
             } else {
                 super.setHoverImageDescriptor(defaultHoverImage);
                 super.setImageDescriptor(defaultImage);
                 super.setDisabledImageDescriptor(defaultDisabledImage);
             }
         }
     }

 }

